qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v5 19/20] hw/arm/virt-acpi-build: Add PCIe contr


From: Shannon Zhao
Subject: Re: [Qemu-devel] [PATCH v5 19/20] hw/arm/virt-acpi-build: Add PCIe controller in ACPI DSDT table
Date: Wed, 29 Apr 2015 21:37:11 +0800
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0



On 2015/4/29 16:47, Igor Mammedov wrote:
On Wed, 29 Apr 2015 11:12:04 +0800
Shannon Zhao <address@hidden> wrote:

On 2015/4/28 23:54, Michael S. Tsirkin wrote:
On Tue, Apr 28, 2015 at 05:13:10PM +0200, Igor Mammedov wrote:
Here I need to set the value of buffer to 1 or 0, we could
createbitfield, but if we want to set the value to non one or zero and
the BufferSize is large, how could we do? CreateByteField? It's a little
complex for user.
that's what one would have to do writing it in ASL if bits
are flipped on/off dynamically.

In ASL you also can declare buffer with static initializer

    Buffer (0x01) { 0x03 }

and compiler is smart enough to set appropriate bits but it doesn't
allow you to do so with large values. For example:

    Buffer (0x01) { 0xAABBCCDD }

gives error:
Error 6139 - Constant out of range ^  (0xAABBCCDD, allowable: 0x0-0xFF)

If one wants to manipulate specific fields in Buffer, ASL has
a bunch of CreateFOOField operators, so lets follow spec and use
API consistently to avoid confusion.

BTW:
packaging value as int (even without prefix) is wrong since
its LE encoding will shuffle bytes and you won't get bits in
positions that you expect if value is more than 1 byte.

I don't care about ASL, we are writing in C
But AML is same:
DefBuffer := BufferOp PkgLength BufferSize ByteList
BufferOp := 0x11
BufferSize := TermArg => Integer

So really just a bytelist.
We don't have any users for aml_buffer, maybe just add
const uint8_t *bytes, unsigned len as parameters.


Agree. It's consistent with the spec. If want to modify the value, could
use CreateFOOField.

So use following fuction to initialize Buffer?

/* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefBuffer */
Aml *aml_buffer(int buffer_size, uint8_t *byte_list)
{
     int i;
     Aml *var = aml_bundle(0x11 /* BufferOp */, AML_BUFFER);
     for (i = 0; i < buffer_size; i++) {
         build_append_byte(var->buf, *(byte_list + i));
     }
     return var;
}
maybe

Aml *aml_buffer_initialized(int buffer_size, uint8_t *byte_list);
Aml *aml_buffer(int buffer_size);

the second one is needed for implementing code like:
Name(BUFF, Buffer(4){}) // Create SerialBus data buffer as BUFF
CreateByteField(BUFF, 0x00, STAT) // STAT = Status (Byte)
CreateWordField(BUFF, 0x02, DATA) // DATA = Data (Byte)

and could reuse aml_buffer_initialized() to reserve space.


maybe we could use only one. For the uninitialized buffer we can pass byte_list as NULL and within aml_buffer check byte_list, if byte_list is NULL, just reserve space.

/* ACPI 1.0b: 16.2.5.4 Type 2 Opcodes Encoding: DefBuffer */
Aml *aml_buffer(int buffer_size, uint8_t *byte_list)
{
    int i;
    Aml *var = aml_bundle(0x11 /* BufferOp */, AML_BUFFER);

    for (i = 0; i < buffer_size; i++) {
        if (byte_list == NULL)
            build_append_byte(var->buf, 0);
        else
            build_append_byte(var->buf, *(byte_list + i));
   }

   return var;
}


Would that be enough?



ifctx1 = aml_if(aml_equal(aml_arg(2), aml_int(0)));
aml_append(ifctx1, aml_store(aml_name("FNEN", aml_int(1)));
...
/* create bit field for every supported function if supported */
...
aml_append(method, aml_return(aml_name("RET")));




+    aml_append(ifctx1, aml_return(buf));
+    aml_append(ifctx, ifctx1);
+    aml_append(method, ifctx);
+
+    buf = aml_buffer();
+    build_append_int_noprefix(buf->buf, 0x00, 1);
+    aml_append(method, aml_return(buf));
+    aml_append(dev, method);
+
+    Aml *dev_rp0 = aml_device("%s", "RP0");
+    aml_append(dev_rp0, aml_name_decl("_ADR", aml_int(0)));
+    aml_append(dev, dev_rp0);
+    aml_append(scope, dev);
+}
+
  /* RSDP */
  static GArray *
  build_rsdp(GArray *rsdp_table, GArray *linker, unsigned rsdt)
@@ -318,6 +468,8 @@ build_dsdt(GArray *table_data, GArray *linker, 
VirtGuestInfo *guest_info)
      acpi_dsdt_add_flash(scope, info->flash_memmap);
      acpi_dsdt_add_virtio(scope, info->virtio_mmio_memmap,
               info->virtio_mmio_irq, info->virtio_mmio_num);
+    acpi_dsdt_add_pci(scope, guest_info->pcie_info);
+
      aml_append(dsdt, scope);

      /* copy AML table into ACPI tables blob and patch header there */

.





.




.







reply via email to

[Prev in Thread] Current Thread [Next in Thread]