[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [linux-2.6.18-xen] merge with linux-2.6.18-xen.hg
# HG changeset patch # User Isaku Yamahata <yamahata@xxxxxxxxxxxxx> # Date 1210836376 -32400 # Node ID 2d858799d109f2225882257c029c84ae10538972 # Parent e5933404dadad1fb144b8cc29caad044cc54a491 # Parent d59a4aaf8615aea0ff42349f0d0367be641c36b0 merge with linux-2.6.18-xen.hg --- arch/i386/kernel/acpi/processor_extcntl_xen.c | 95 +++++++++++++++++++- drivers/acpi/dispatcher/dsobject.c | 91 ++++++++++++++++++- drivers/acpi/processor_extcntl.c | 113 +++++++++++++++++++++++- drivers/acpi/processor_perflib.c | 8 + drivers/pci/msi-xen.c | 22 +--- drivers/xen/blkback/blkback.c | 3 drivers/xen/blktap/blktap.c | 3 drivers/xen/pciback/conf_space_capability_msi.c | 5 - include/acpi/processor.h | 2 include/xen/blkif.h | 10 +- include/xen/interface/hvm/hvm_op.h | 5 + include/xen/interface/io/pciif.h | 14 ++ include/xen/interface/platform.h | 51 ++++++++++ 13 files changed, 391 insertions(+), 31 deletions(-) diff -r e5933404dada -r 2d858799d109 arch/i386/kernel/acpi/processor_extcntl_xen.c --- a/arch/i386/kernel/acpi/processor_extcntl_xen.c Tue May 13 10:42:09 2008 +0900 +++ b/arch/i386/kernel/acpi/processor_extcntl_xen.c Thu May 15 16:26:16 2008 +0900 @@ -28,6 +28,7 @@ #include <linux/pm.h> #include <linux/cpu.h> +#include <linux/cpufreq.h> #include <acpi/processor.h> #include <asm/hypercall.h> @@ -110,9 +111,101 @@ static int xen_cx_notifier(struct acpi_p return ret; } +static void convert_pct_reg(struct xen_pct_register *xpct, + struct acpi_pct_register *apct) +{ + xpct->descriptor = apct->descriptor; + xpct->length = apct->length; + xpct->space_id = apct->space_id; + xpct->bit_width = apct->bit_width; + xpct->bit_offset = apct->bit_offset; + xpct->reserved = apct->reserved; + xpct->address = apct->address; +} + +static void convert_pss_states(struct xen_processor_px *xpss, + struct acpi_processor_px *apss, int state_count) +{ + int i; + for(i=0; i<state_count; i++) { + xpss->core_frequency = apss->core_frequency; + xpss->power = apss->power; + xpss->transition_latency = apss->transition_latency; + xpss->bus_master_latency = apss->bus_master_latency; + xpss->control = apss->control; + xpss->status = apss->status; + xpss++; + apss++; + } +} + +static void convert_psd_pack(struct xen_psd_package *xpsd, + struct acpi_psd_package *apsd) +{ + xpsd->num_entries = apsd->num_entries; + xpsd->revision = apsd->revision; + xpsd->domain = apsd->domain; + xpsd->coord_type = apsd->coord_type; + xpsd->num_processors = apsd->num_processors; +} + static int xen_px_notifier(struct acpi_processor *pr, int action) { - return -EINVAL; + int ret; + xen_platform_op_t op = { + .cmd = XENPF_set_processor_pminfo, + .interface_version = XENPF_INTERFACE_VERSION, + .u.set_pminfo.id = pr->acpi_id, + .u.set_pminfo.type = XEN_PM_PX, + }; + struct xen_processor_performance *perf; + struct xen_processor_px *states = NULL; + struct acpi_processor_performance *px; + struct acpi_psd_package *pdomain; + + /* leave dynamic ppc handle in the future */ + if (action == PROCESSOR_PM_CHANGE) + return 0; + + perf = &op.u.set_pminfo.perf; + px = pr->performance; + + perf->flags = XEN_PX_PPC | + XEN_PX_PCT | + XEN_PX_PSS | + XEN_PX_PSD; + + /* ppc */ + perf->ppc = pr->performance_platform_limit; + + /* pct */ + convert_pct_reg(&perf->control_register, &px->control_register); + convert_pct_reg(&perf->status_register, &px->status_register); + + /* pss */ + perf->state_count = px->state_count; + states = kzalloc(px->state_count*sizeof(xen_processor_px_t),GFP_KERNEL); + if (!states) + return -ENOMEM; + convert_pss_states(states, px->states, px->state_count); + set_xen_guest_handle(perf->states, states); + + /* psd */ + pdomain = &px->domain_info; + convert_psd_pack(&perf->domain_info, pdomain); + if (perf->domain_info.num_processors) { + if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ALL) + perf->shared_type = CPUFREQ_SHARED_TYPE_ALL; + else if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ANY) + perf->shared_type = CPUFREQ_SHARED_TYPE_ANY; + else if (pdomain->coord_type == DOMAIN_COORD_TYPE_HW_ALL) + perf->shared_type = CPUFREQ_SHARED_TYPE_HW; + } else + perf->shared_type = CPUFREQ_SHARED_TYPE_NONE; + + ret = HYPERVISOR_platform_op(&op); + kfree(states); + return ret; } static int xen_tx_notifier(struct acpi_processor *pr, int action) diff -r e5933404dada -r 2d858799d109 drivers/acpi/dispatcher/dsobject.c --- a/drivers/acpi/dispatcher/dsobject.c Tue May 13 10:42:09 2008 +0900 +++ b/drivers/acpi/dispatcher/dsobject.c Thu May 15 16:26:16 2008 +0900 @@ -137,6 +137,71 @@ acpi_ds_build_internal_object(struct acp return_ACPI_STATUS(status); } } + + /* Special object resolution for elements of a package */ + + if ((op->common.parent->common.aml_opcode == AML_PACKAGE_OP) || + (op->common.parent->common.aml_opcode == + AML_VAR_PACKAGE_OP)) { + /* + * Attempt to resolve the node to a value before we insert it into + * the package. If this is a reference to a common data type, + * resolve it immediately. According to the ACPI spec, package + * elements can only be "data objects" or method references. + * Attempt to resolve to an Integer, Buffer, String or Package. + * If cannot, return the named reference (for things like Devices, + * Methods, etc.) Buffer Fields and Fields will resolve to simple + * objects (int/buf/str/pkg). + * + * NOTE: References to things like Devices, Methods, Mutexes, etc. + * will remain as named references. This behavior is not described + * in the ACPI spec, but it appears to be an oversight. + */ + obj_desc = (union acpi_operand_object *)op->common.node; + + status = + acpi_ex_resolve_node_to_value(ACPI_CAST_INDIRECT_PTR + (struct + acpi_namespace_node, + &obj_desc), + walk_state); + if (ACPI_FAILURE(status)) { + return_ACPI_STATUS(status); + } + + switch (op->common.node->type) { + /* + * For these types, we need the actual node, not the subobject. + * However, the subobject got an extra reference count above. + */ + case ACPI_TYPE_MUTEX: + case ACPI_TYPE_METHOD: + case ACPI_TYPE_POWER: + case ACPI_TYPE_PROCESSOR: + case ACPI_TYPE_EVENT: + case ACPI_TYPE_REGION: + case ACPI_TYPE_DEVICE: + case ACPI_TYPE_THERMAL: + + obj_desc = + (union acpi_operand_object *)op->common. + node; + break; + + default: + break; + } + + /* + * If above resolved to an operand object, we are done. Otherwise, + * we have a NS node, we must create the package entry as a named + * reference. + */ + if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != + ACPI_DESC_TYPE_NAMED) { + goto exit; + } + } } /* Create and init a new internal ACPI object */ @@ -156,6 +221,7 @@ acpi_ds_build_internal_object(struct acp return_ACPI_STATUS(status); } + exit: *obj_desc_ptr = obj_desc; return_ACPI_STATUS(AE_OK); } @@ -358,12 +424,25 @@ acpi_ds_build_internal_package_obj(struc arg = arg->common.next; for (i = 0; arg; i++) { if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { - - /* Object (package or buffer) is already built */ - - obj_desc->package.elements[i] = - ACPI_CAST_PTR(union acpi_operand_object, - arg->common.node); + if (arg->common.node->type == ACPI_TYPE_METHOD) { + /* + * A method reference "looks" to the parser to be a method + * invocation, so we special case it here + */ + arg->common.aml_opcode = AML_INT_NAMEPATH_OP; + status = + acpi_ds_build_internal_object(walk_state, + arg, + &obj_desc-> + package. + elements[i]); + } else { + /* This package element is already built, just get it */ + + obj_desc->package.elements[i] = + ACPI_CAST_PTR(union acpi_operand_object, + arg->common.node); + } } else { status = acpi_ds_build_internal_object(walk_state, arg, &obj_desc-> diff -r e5933404dada -r 2d858799d109 drivers/acpi/processor_extcntl.c --- a/drivers/acpi/processor_extcntl.c Tue May 13 10:42:09 2008 +0900 +++ b/drivers/acpi/processor_extcntl.c Thu May 15 16:26:16 2008 +0900 @@ -31,11 +31,49 @@ #include <acpi/processor.h> static int processor_extcntl_parse_csd(struct acpi_processor *pr); +static int processor_extcntl_get_performance(struct acpi_processor *pr); /* * External processor control logic may register with its own set of * ops to get ACPI related notification. One example is like VMM. */ struct processor_extcntl_ops *processor_extcntl_ops; + +static int processor_notify_smm(void) +{ + acpi_status status; + static int is_done = 0; + + /* only need successfully notify BIOS once */ + /* avoid double notification which may lead to unexpected result */ + if (is_done) + return 0; + + /* Can't write pstate_cnt to smi_cmd if either value is zero */ + if ((!acpi_fadt.smi_cmd) || (!acpi_fadt.pstate_cnt)) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO,"No SMI port or pstate_cnt\n")); + return 0; + } + + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Writing pstate_cnt [0x%x] to smi_cmd [0x%x]\n", + acpi_fadt.pstate_cnt, acpi_fadt.smi_cmd)); + + /* FADT v1 doesn't support pstate_cnt, many BIOS vendors use + * it anyway, so we need to support it... */ + if (acpi_fadt_is_v1) { + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Using v1.0 FADT reserved value for pstate_cnt\n")); + } + + status = acpi_os_write_port(acpi_fadt.smi_cmd, + (u32) acpi_fadt.pstate_cnt, 8); + if (ACPI_FAILURE(status)) + return status; + + is_done = 1; + + return 0; +} int processor_notify_external(struct acpi_processor *pr, int event, int type) { @@ -109,7 +147,12 @@ int processor_extcntl_init(struct acpi_p int processor_extcntl_init(struct acpi_processor *pr) { /* parse cstate dependency information */ - processor_extcntl_parse_csd(pr); + if (processor_pm_external()) + processor_extcntl_parse_csd(pr); + + /* Initialize performance states */ + if (processor_pmperf_external()) + processor_extcntl_get_performance(pr); return 0; } @@ -135,3 +178,71 @@ static int processor_extcntl_parse_csd(s return 0; } + +/* + * Existing ACPI module does parse performance states at some point, + * when acpi-cpufreq driver is loaded which however is something + * we'd like to disable to avoid confliction with external control + * logic. So we have to collect raw performance information here + * when ACPI processor object is found and started. + */ +#ifdef CONFIG_CPU_FREQ +static int processor_extcntl_get_performance(struct acpi_processor *pr) +{ + int ret; + struct acpi_processor_performance *perf; + struct acpi_psd_package *pdomain; + + if (pr->performance) + return -EBUSY; + + perf = kzalloc(sizeof(struct acpi_processor_performance), GFP_KERNEL); + if (!perf) + return -ENOMEM; + + pr->performance = perf; + /* Get basic performance state information */ + ret = acpi_processor_get_performance_info(pr); + if (ret < 0) + goto err_out; + + /* + * Well, here we need retrieve performance dependency information + * from _PSD object. The reason why existing interface is not used + * is due to the reason that existing interface sticks to Linux cpu + * id to construct some bitmap, however we want to split ACPI + * processor objects from Linux cpu id logic. For example, even + * when Linux is configured as UP, we still want to parse all ACPI + * processor objects to external logic. In this case, it's preferred + * to use ACPI ID instead. + */ + pr->performance->domain_info.num_processors = 0; + ret = acpi_processor_get_psd(pr); + if (ret < 0) + goto err_out; + + /* Some sanity check */ + pdomain = &pr->performance->domain_info; + if ((pdomain->revision != ACPI_PSD_REV0_REVISION) || + (pdomain->num_entries != ACPI_PSD_REV0_ENTRIES) || + ((pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ALL) && + (pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ANY) && + (pdomain->coord_type != DOMAIN_COORD_TYPE_HW_ALL))) { + ret = -EINVAL; + goto err_out; + } + + /* Last step is to notify BIOS that external logic exists */ + processor_notify_smm(); + + processor_notify_external(pr, PROCESSOR_PM_INIT, PM_TYPE_PERF); + + return 0; +err_out: + pr->performance = NULL; + kfree(perf); + return ret; +} +#else +static int processor_extcntl_get_performance(struct acpi_processor *pr) { return 0; } +#endif diff -r e5933404dada -r 2d858799d109 drivers/acpi/processor_perflib.c --- a/drivers/acpi/processor_perflib.c Tue May 13 10:42:09 2008 +0900 +++ b/drivers/acpi/processor_perflib.c Thu May 15 16:26:16 2008 +0900 @@ -304,7 +304,11 @@ static int acpi_processor_get_performanc return result; } +#ifndef CONFIG_PROCESSOR_EXTERNAL_CONTROL static int acpi_processor_get_performance_info(struct acpi_processor *pr) +#else +int acpi_processor_get_performance_info(struct acpi_processor *pr) +#endif { int result = 0; acpi_status status = AE_OK; @@ -543,7 +547,11 @@ static void acpi_cpufreq_remove_file(str } #endif /* CONFIG_X86_ACPI_CPUFREQ_PROC_INTF */ +#ifndef CONFIG_PROCESSOR_EXTERNAL_CONTROL static int acpi_processor_get_psd(struct acpi_processor *pr) +#else +int acpi_processor_get_psd(struct acpi_processor *pr) +#endif { int result = 0; acpi_status status = AE_OK; diff -r e5933404dada -r 2d858799d109 drivers/pci/msi-xen.c --- a/drivers/pci/msi-xen.c Tue May 13 10:42:09 2008 +0900 +++ b/drivers/pci/msi-xen.c Thu May 15 16:26:16 2008 +0900 @@ -32,7 +32,7 @@ int msi_register(struct msi_ops *ops) return 0; } -static struct list_head msi_dev_head; +static LIST_HEAD(msi_dev_head); static int msi_dev_head_inited = 0; DEFINE_SPINLOCK(msi_dev_lock); @@ -54,11 +54,6 @@ static struct msi_dev_list *get_msi_dev_ struct msi_dev_list *msi_dev_list, *ret = NULL; unsigned long flags; - if (!msi_dev_head_inited) { - INIT_LIST_HEAD(&msi_dev_head); - msi_dev_head_inited = 1; - } - spin_lock_irqsave(&msi_dev_lock, flags); list_for_each_entry(msi_dev_list, &msi_dev_head, list) @@ -79,10 +74,10 @@ static struct msi_dev_list *get_msi_dev_ return NULL; } + spin_lock_init(&ret->pirq_list_lock); + INIT_LIST_HEAD(&ret->pirq_list_head); list_add_tail(&ret->list, &msi_dev_head); spin_unlock_irqrestore(&msi_dev_lock, flags); - spin_lock_init(&ret->pirq_list_lock); - INIT_LIST_HEAD(&ret->pirq_list_head); return ret; } @@ -304,10 +299,9 @@ int pci_save_msix_state(struct pci_dev * msi_dev_entry = get_msi_dev_pirq_list(dev); spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags); - if (!list_empty_careful(&msi_dev_entry->pirq_list_head)) - list_for_each_entry_safe(pirq_entry, tmp, - &msi_dev_entry->pirq_list_head, list) - msi_unmap_pirq(dev, pirq_entry->pirq); + list_for_each_entry_safe(pirq_entry, tmp, + &msi_dev_entry->pirq_list_head, list) + msi_unmap_pirq(dev, pirq_entry->pirq); spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags); disable_msi_mode(dev, pos, PCI_CAP_ID_MSIX); @@ -394,7 +388,7 @@ static int msix_capability_init(struct p return -ENOMEM; spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags); - if (!list_empty_careful(&msi_dev_entry->pirq_list_head)) + if (!list_empty(&msi_dev_entry->pirq_list_head)) { printk(KERN_WARNING "msix pirqs for dev %02x:%02x:%01x are not freed \ before acquire again.\n", dev->bus->number, PCI_SLOT(dev->devfn), @@ -677,7 +671,7 @@ void msi_remove_pci_irq_vectors(struct p msi_dev_entry = get_msi_dev_pirq_list(dev); spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags); - if (!list_empty_careful(&msi_dev_entry->pirq_list_head)) + if (!list_empty(&msi_dev_entry->pirq_list_head)) { printk(KERN_WARNING "msix pirqs for dev %02x:%02x:%01x are not freed \ before acquire again.\n", dev->bus->number, PCI_SLOT(dev->devfn), diff -r e5933404dada -r 2d858799d109 drivers/xen/blkback/blkback.c --- a/drivers/xen/blkback/blkback.c Tue May 13 10:42:09 2008 +0900 +++ b/drivers/xen/blkback/blkback.c Thu May 15 16:26:16 2008 +0900 @@ -343,6 +343,9 @@ static int do_block_io_op(blkif_t *blkif BUG(); } blk_rings->common.req_cons = ++rc; /* before make_response() */ + + /* Apply all sanity checks to /private copy/ of request. */ + barrier(); switch (req.operation) { case BLKIF_OP_READ: diff -r e5933404dada -r 2d858799d109 drivers/xen/blktap/blktap.c --- a/drivers/xen/blktap/blktap.c Tue May 13 10:42:09 2008 +0900 +++ b/drivers/xen/blktap/blktap.c Thu May 15 16:26:16 2008 +0900 @@ -1264,6 +1264,9 @@ static int do_block_io_op(blkif_t *blkif } blk_rings->common.req_cons = ++rc; /* before make_response() */ + /* Apply all sanity checks to /private copy/ of request. */ + barrier(); + switch (req.operation) { case BLKIF_OP_READ: blkif->st_rd_req++; diff -r e5933404dada -r 2d858799d109 drivers/xen/pciback/conf_space_capability_msi.c --- a/drivers/xen/pciback/conf_space_capability_msi.c Tue May 13 10:42:09 2008 +0900 +++ b/drivers/xen/pciback/conf_space_capability_msi.c Thu May 15 16:26:16 2008 +0900 @@ -11,7 +11,6 @@ int pciback_enable_msi(struct pciback_de struct pci_dev *dev, struct xen_pci_op *op) { int otherend = pdev->xdev->otherend_id; - int irq; int status; status = pci_enable_msi(dev); @@ -29,8 +28,6 @@ int pciback_disable_msi(struct pciback_d int pciback_disable_msi(struct pciback_device *pdev, struct pci_dev *dev, struct xen_pci_op *op) { - int old_irq = dev->irq; - pci_disable_msi(dev); op->value = dev->irq; @@ -40,7 +37,7 @@ int pciback_enable_msix(struct pciback_d int pciback_enable_msix(struct pciback_device *pdev, struct pci_dev *dev, struct xen_pci_op *op) { - int otherend = pdev->xdev->otherend_id, result, i; + int result; result = pci_enable_msix(dev, op->msix_entries, op->value); diff -r e5933404dada -r 2d858799d109 include/acpi/processor.h --- a/include/acpi/processor.h Tue May 13 10:42:09 2008 +0900 +++ b/include/acpi/processor.h Thu May 15 16:26:16 2008 +0900 @@ -353,6 +353,8 @@ extern int processor_register_extcntl(st extern int processor_register_extcntl(struct processor_extcntl_ops *ops); extern int processor_unregister_extcntl(struct processor_extcntl_ops *ops); extern int processor_extcntl_init(struct acpi_processor *pr); +extern int acpi_processor_get_performance_info(struct acpi_processor *pr); +extern int acpi_processor_get_psd(struct acpi_processor *pr); #else static inline int processor_cntl_external(void) {return 0;} static inline int processor_pm_external(void) {return 0;} diff -r e5933404dada -r 2d858799d109 include/xen/blkif.h --- a/include/xen/blkif.h Tue May 13 10:42:09 2008 +0900 +++ b/include/xen/blkif.h Thu May 15 16:26:16 2008 +0900 @@ -98,8 +98,9 @@ static void inline blkif_get_x86_32_req( dst->handle = src->handle; dst->id = src->id; dst->sector_number = src->sector_number; - if (n > src->nr_segments) - n = src->nr_segments; + barrier(); + if (n > dst->nr_segments) + n = dst->nr_segments; for (i = 0; i < n; i++) dst->seg[i] = src->seg[i]; } @@ -112,8 +113,9 @@ static void inline blkif_get_x86_64_req( dst->handle = src->handle; dst->id = src->id; dst->sector_number = src->sector_number; - if (n > src->nr_segments) - n = src->nr_segments; + barrier(); + if (n > dst->nr_segments) + n = dst->nr_segments; for (i = 0; i < n; i++) dst->seg[i] = src->seg[i]; } diff -r e5933404dada -r 2d858799d109 include/xen/interface/hvm/hvm_op.h --- a/include/xen/interface/hvm/hvm_op.h Tue May 13 10:42:09 2008 +0900 +++ b/include/xen/interface/hvm/hvm_op.h Thu May 15 16:26:16 2008 +0900 @@ -73,6 +73,9 @@ DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_ /* Flushes all VCPU TLBs: @arg must be NULL. */ #define HVMOP_flush_tlbs 5 +/* Following tools-only interfaces may change in future. */ +#if defined(__XEN__) || defined(__XEN_TOOLS__) + /* Track dirty VRAM. */ #define HVMOP_track_dirty_vram 6 struct xen_hvm_track_dirty_vram { @@ -89,4 +92,6 @@ typedef struct xen_hvm_track_dirty_vram typedef struct xen_hvm_track_dirty_vram xen_hvm_track_dirty_vram_t; DEFINE_XEN_GUEST_HANDLE(xen_hvm_track_dirty_vram_t); +#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ + #endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */ diff -r e5933404dada -r 2d858799d109 include/xen/interface/io/pciif.h --- a/include/xen/interface/io/pciif.h Tue May 13 10:42:09 2008 +0900 +++ b/include/xen/interface/io/pciif.h Thu May 15 16:26:16 2008 +0900 @@ -34,6 +34,10 @@ /* xen_pci_op commands */ #define XEN_PCI_OP_conf_read (0) #define XEN_PCI_OP_conf_write (1) +#define XEN_PCI_OP_enable_msi (2) +#define XEN_PCI_OP_disable_msi (3) +#define XEN_PCI_OP_enable_msix (4) +#define XEN_PCI_OP_disable_msix (5) /* xen_pci_op error numbers */ #define XEN_PCI_ERR_success (0) @@ -43,6 +47,12 @@ #define XEN_PCI_ERR_not_implemented (-4) /* XEN_PCI_ERR_op_failed - backend failed to complete the operation */ #define XEN_PCI_ERR_op_failed (-5) + +/* + * it should be PAGE_SIZE-sizeof(struct xen_pci_op))/sizeof(struct msix_entry)) + * Should not exceed 128 + */ +#define SH_INFO_MAX_VEC 128 struct xen_pci_op { /* IN: what action to perform: XEN_PCI_OP_* */ @@ -62,6 +72,10 @@ struct xen_pci_op { /* IN/OUT: Contains the result after a READ or the value to WRITE */ uint32_t value; + /* IN: Contains extra infor for this operation */ + uint32_t info; + /*IN: param for msi-x */ + struct msix_entry msix_entries[SH_INFO_MAX_VEC]; }; struct xen_pci_sharedinfo { diff -r e5933404dada -r 2d858799d109 include/xen/interface/platform.h --- a/include/xen/interface/platform.h Tue May 13 10:42:09 2008 +0900 +++ b/include/xen/interface/platform.h Thu May 15 16:26:16 2008 +0900 @@ -211,6 +211,12 @@ DEFINE_XEN_GUEST_HANDLE(xenpf_getidletim #define XEN_PM_PX 1 #define XEN_PM_TX 2 +/* Px sub info type */ +#define XEN_PX_PCT 1 +#define XEN_PX_PSS 2 +#define XEN_PX_PPC 4 +#define XEN_PX_PSD 8 + struct xen_power_register { uint32_t space_id; uint32_t bit_width; @@ -252,12 +258,55 @@ struct xen_processor_power { XEN_GUEST_HANDLE(xen_processor_cx_t) states; /* supported c states */ }; +struct xen_pct_register { + uint8_t descriptor; + uint16_t length; + uint8_t space_id; + uint8_t bit_width; + uint8_t bit_offset; + uint8_t reserved; + uint64_t address; +}; + +struct xen_processor_px { + uint64_t core_frequency; /* megahertz */ + uint64_t power; /* milliWatts */ + uint64_t transition_latency; /* microseconds */ + uint64_t bus_master_latency; /* microseconds */ + uint64_t control; /* control value */ + uint64_t status; /* success indicator */ +}; +typedef struct xen_processor_px xen_processor_px_t; +DEFINE_XEN_GUEST_HANDLE(xen_processor_px_t); + +struct xen_psd_package { + uint64_t num_entries; + uint64_t revision; + uint64_t domain; + uint64_t coord_type; + uint64_t num_processors; +}; + +struct xen_processor_performance { + uint32_t flags; /* flag for Px sub info type */ + uint32_t ppc; /* Platform limitation on freq usage */ + struct xen_pct_register control_register; + struct xen_pct_register status_register; + uint32_t state_count; /* total available performance states */ + XEN_GUEST_HANDLE(xen_processor_px_t) states; + struct xen_psd_package domain_info; + uint32_t shared_type; /* coordination type of this processor */ +}; +typedef struct xen_processor_performance xen_processor_performance_t; +DEFINE_XEN_GUEST_HANDLE(xen_processor_performance_t); + struct xenpf_set_processor_pminfo { /* IN variables */ uint32_t id; /* ACPI CPU ID */ - uint32_t type; /* {XEN_PM_CX, ...} */ + uint32_t type; /* {XEN_PM_CX, XEN_PM_PX} */ union { struct xen_processor_power power;/* Cx: _CST/_CSD */ + struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */ }; }; typedef struct xenpf_set_processor_pminfo xenpf_set_processor_pminfo_t; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |