[Qemu-devel] Re: seabios: acpi: add _RMV control method for PCI devices
On Wed, Dec 08, 2010 at 03:08:59PM -0200, Marcelo Tosatti wrote: > Use _RMV method to indicate whether device can be removed. > > Data is retrieved from QEMU via I/O port 0xae0c. > > Signed-off-by: Marcelo Tosatti > Acked-by: Gleb Natapov > Index: seabios/src/acpi-dsdt.dsl > === > --- seabios.orig/src/acpi-dsdt.dsl > +++ seabios/src/acpi-dsdt.dsl > @@ -122,6 +122,12 @@ DefinitionBlock ( > B0EJ, 32, > } > > +OperationRegion(RMVC, SystemIO, 0xae0c, 0x04) > +Field(RMVC, DWordAcc, NoLock, WriteAsZeros) > +{ > +PCRM, 32, > +} > + > #define hotplug_slot(name, nr) \ > Device (S##name) {\ > Name (_ADR, nr##) \ > @@ -245,11 +251,14 @@ DefinitionBlock ( > { > Return (0x00) > } > + Method(_RMV) { Return (0x00) } > } > > /* PIIX3 ISA bridge */ > Device (ISA) { > Name (_ADR, 0x0001) > +Method(_RMV) { Return (0x00) } > + > > /* PIIX PCI to ISA irq remapping */ > OperationRegion (P40C, PCI_Config, 0x60, 0x04) > @@ -442,6 +451,49 @@ DefinitionBlock ( > DRSJ, 32 > } > } > + > +#define gen_pci_device(name, nr)\ > +Device(SL##name) { \ > +Name (_ADR, nr##) \ > +Method (_RMV) { \ > +If (And(\_SB.PCI0.PCRM, ShiftLeft(1, nr))) {\ > +Return (0x1)\ > +} \ > +Return (0x0)\ > +} \ > +Name (_SUN, name) \ > +} > + > +/* VGA (slot 1) and ISA bus (slot 2) defined above */ > + gen_pci_device(3, 0x0003) > + gen_pci_device(4, 0x0004) > + gen_pci_device(5, 0x0005) > + gen_pci_device(6, 0x0006) > + gen_pci_device(7, 0x0007) > + gen_pci_device(8, 0x0008) > + gen_pci_device(9, 0x0009) > + gen_pci_device(10, 0x000a) > + gen_pci_device(11, 0x000b) > + gen_pci_device(12, 0x000c) > + gen_pci_device(13, 0x000d) > + gen_pci_device(14, 0x000e) > + gen_pci_device(15, 0x000f) > + gen_pci_device(16, 0x0010) > + gen_pci_device(17, 0x0011) > + gen_pci_device(18, 0x0012) > + gen_pci_device(19, 0x0013) > + gen_pci_device(20, 0x0014) > + gen_pci_device(21, 0x0015) > + gen_pci_device(22, 0x0016) > + gen_pci_device(23, 0x0017) > + gen_pci_device(24, 0x0018) > + gen_pci_device(25, 0x0019) > + gen_pci_device(26, 0x001a) > + gen_pci_device(27, 0x001b) > + gen_pci_device(28, 0x001c) > + gen_pci_device(29, 0x001d) > + gen_pci_device(30, 0x001e) > + gen_pci_device(31, 0x001f) > } > > /* PCI IRQs */ -- Gleb.
[Qemu-devel] Re: seabios: acpi: add _RMV control method for PCI devices
On Wed, Dec 08, 2010 at 09:58:35PM +0200, Gleb Natapov wrote: > On Wed, Dec 08, 2010 at 04:01:18PM -0200, Marcelo Tosatti wrote: > > On Wed, Dec 08, 2010 at 07:34:42PM +0200, Gleb Natapov wrote: > > > On Wed, Dec 08, 2010 at 03:08:59PM -0200, Marcelo Tosatti wrote: > > > > Use _RMV method to indicate whether device can be removed. > > > > > > > But Windows still shows device as removable in the gui and allows to > > > remove it, correct? > > > > No. From "Designing Hardware for Surprise Removal under Windows XP" > > document: > > > > "An ACPI BIOS can override the Removable capability by using the _RMV > > method ..." > > > Cool. I wonder how it co-exists with _EJ0 method for the same device. The Linux driver, at least, will use the _EJ0 method of the first device object. I guess Windows does the same. > > > > +#define gen_pci_device(name, nr)\ > > > > +Device(SL##name) { \ > > > > +Name (_ADR, nr##) \ > > > > +Method (_RMV) { \ > > > > +If (And(\_SB.PCI0.PCRM, ShiftLeft(1, nr))) {\ > > > > +Return (0x1)\ > > > > +} \ > > > > +Return (0x0)\ > > > > +} \ > > > > +Name (_SUN, name) \ > > > > +} > > > Why not add this to hotplug_slot() macro? > > > > Because its ignored if declared in the device object thats a child > > of SB.PCI0 (hotplug_slot). > Any idea why? > > -- > Gleb. Because _EJ0 overrides _RMV when deciding removability, inside a device object (just checked). So the above "if declared in a child of SB.PCI0..." is wrong.
[Qemu-devel] Re: seabios: acpi: add _RMV control method for PCI devices
On Wed, Dec 08, 2010 at 04:01:18PM -0200, Marcelo Tosatti wrote: > On Wed, Dec 08, 2010 at 07:34:42PM +0200, Gleb Natapov wrote: > > On Wed, Dec 08, 2010 at 03:08:59PM -0200, Marcelo Tosatti wrote: > > > Use _RMV method to indicate whether device can be removed. > > > > > But Windows still shows device as removable in the gui and allows to > > remove it, correct? > > No. From "Designing Hardware for Surprise Removal under Windows XP" > document: > > "An ACPI BIOS can override the Removable capability by using the _RMV > method ..." > Cool. I wonder how it co-exists with _EJ0 method for the same device. > > > +#define gen_pci_device(name, nr)\ > > > +Device(SL##name) { \ > > > +Name (_ADR, nr##) \ > > > +Method (_RMV) { \ > > > +If (And(\_SB.PCI0.PCRM, ShiftLeft(1, nr))) {\ > > > +Return (0x1)\ > > > +} \ > > > +Return (0x0)\ > > > +} \ > > > +Name (_SUN, name) \ > > > +} > > Why not add this to hotplug_slot() macro? > > Because its ignored if declared in the device object thats a child > of SB.PCI0 (hotplug_slot). Any idea why? -- Gleb.
[Qemu-devel] Re: seabios: acpi: add _RMV control method for PCI devices
On Wed, Dec 08, 2010 at 07:34:42PM +0200, Gleb Natapov wrote: > On Wed, Dec 08, 2010 at 03:08:59PM -0200, Marcelo Tosatti wrote: > > Use _RMV method to indicate whether device can be removed. > > > But Windows still shows device as removable in the gui and allows to > remove it, correct? No. From "Designing Hardware for Surprise Removal under Windows XP" document: "An ACPI BIOS can override the Removable capability by using the _RMV method ..." > > +#define gen_pci_device(name, nr)\ > > +Device(SL##name) { \ > > +Name (_ADR, nr##) \ > > +Method (_RMV) { \ > > +If (And(\_SB.PCI0.PCRM, ShiftLeft(1, nr))) {\ > > +Return (0x1)\ > > +} \ > > +Return (0x0)\ > > +} \ > > +Name (_SUN, name) \ > > +} > Why not add this to hotplug_slot() macro? Because its ignored if declared in the device object thats a child of SB.PCI0 (hotplug_slot).
[Qemu-devel] Re: seabios: acpi: add _RMV control method for PCI devices
On Wed, Dec 08, 2010 at 03:08:59PM -0200, Marcelo Tosatti wrote: > Use _RMV method to indicate whether device can be removed. > But Windows still shows device as removable in the gui and allows to remove it, correct? > Data is retrieved from QEMU via I/O port 0xae0c. > > Signed-off-by: Marcelo Tosatti > > Index: seabios/src/acpi-dsdt.dsl > === > --- seabios.orig/src/acpi-dsdt.dsl > +++ seabios/src/acpi-dsdt.dsl > @@ -122,6 +122,12 @@ DefinitionBlock ( > B0EJ, 32, > } > > +OperationRegion(RMVC, SystemIO, 0xae0c, 0x04) > +Field(RMVC, DWordAcc, NoLock, WriteAsZeros) > +{ > +PCRM, 32, > +} > + > #define hotplug_slot(name, nr) \ > Device (S##name) {\ > Name (_ADR, nr##) \ > @@ -245,11 +251,14 @@ DefinitionBlock ( > { > Return (0x00) > } > + Method(_RMV) { Return (0x00) } > } > > /* PIIX3 ISA bridge */ > Device (ISA) { > Name (_ADR, 0x0001) > +Method(_RMV) { Return (0x00) } > + > > /* PIIX PCI to ISA irq remapping */ > OperationRegion (P40C, PCI_Config, 0x60, 0x04) > @@ -442,6 +451,49 @@ DefinitionBlock ( > DRSJ, 32 > } > } > + > +#define gen_pci_device(name, nr)\ > +Device(SL##name) { \ > +Name (_ADR, nr##) \ > +Method (_RMV) { \ > +If (And(\_SB.PCI0.PCRM, ShiftLeft(1, nr))) {\ > +Return (0x1)\ > +} \ > +Return (0x0)\ > +} \ > +Name (_SUN, name) \ > +} Why not add this to hotplug_slot() macro? > + > +/* VGA (slot 1) and ISA bus (slot 2) defined above */ > + gen_pci_device(3, 0x0003) > + gen_pci_device(4, 0x0004) > + gen_pci_device(5, 0x0005) > + gen_pci_device(6, 0x0006) > + gen_pci_device(7, 0x0007) > + gen_pci_device(8, 0x0008) > + gen_pci_device(9, 0x0009) > + gen_pci_device(10, 0x000a) > + gen_pci_device(11, 0x000b) > + gen_pci_device(12, 0x000c) > + gen_pci_device(13, 0x000d) > + gen_pci_device(14, 0x000e) > + gen_pci_device(15, 0x000f) > + gen_pci_device(16, 0x0010) > + gen_pci_device(17, 0x0011) > + gen_pci_device(18, 0x0012) > + gen_pci_device(19, 0x0013) > + gen_pci_device(20, 0x0014) > + gen_pci_device(21, 0x0015) > + gen_pci_device(22, 0x0016) > + gen_pci_device(23, 0x0017) > + gen_pci_device(24, 0x0018) > + gen_pci_device(25, 0x0019) > + gen_pci_device(26, 0x001a) > + gen_pci_device(27, 0x001b) > + gen_pci_device(28, 0x001c) > + gen_pci_device(29, 0x001d) > + gen_pci_device(30, 0x001e) > + gen_pci_device(31, 0x001f) > } > > /* PCI IRQs */ -- Gleb.