Ejemplo n.º 1
0
unsigned long acpi_fill_hest(acpi_hest_t *hest)
{
	void *addr, *current;

	/* Skip the HEST header. */
	current = (void *)(hest + 1);

	addr = agesawrapper_getlateinitptr(PICK_WHEA_MCE);
	if (addr != NULL)
		current += acpi_create_hest_error_source(hest, current, 0, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);

	addr = agesawrapper_getlateinitptr(PICK_WHEA_CMC);
	if (addr != NULL)
		current += acpi_create_hest_error_source(hest, current, 1, (void *)((u32)addr + 2), *(UINT16 *)addr - 2);

	return (unsigned long)current;
}
Ejemplo n.º 2
0
unsigned long write_acpi_tables(unsigned long start)
{
	unsigned long current;
	acpi_rsdp_t *rsdp;
	acpi_rsdt_t *rsdt;
	acpi_hpet_t *hpet;
	acpi_madt_t *madt;
	acpi_srat_t *srat;
	acpi_slit_t *slit;
	acpi_fadt_t *fadt;
	acpi_facs_t *facs;
	acpi_header_t *dsdt;
	acpi_header_t *ssdt;
	acpi_header_t *alib;
	acpi_header_t *ivrs;
	acpi_hest_t *hest;

	get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */

	/* Align ACPI tables to 16 bytes */
	start = ALIGN(start, 16);
	current = start;

	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);

	/* We need at least an RSDP and an RSDT Table */
	rsdp = (acpi_rsdp_t *) current;
	current += sizeof(acpi_rsdp_t);
	rsdt = (acpi_rsdt_t *) current;
	current += sizeof(acpi_rsdt_t);

	/* clear all table memory */
	memset((void *)start, 0, current - start);

	acpi_write_rsdp(rsdp, rsdt, NULL);
	acpi_write_rsdt(rsdt);

	/* DSDT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
	dsdt = (acpi_header_t *)current; /* it will used by fadt */
	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
	current += dsdt->length;
	memcpy(dsdt, &AmlCode, dsdt->length);
	printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);

	/* FACS */ /* it needs 64 bit alignment */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
	facs = (acpi_facs_t *) current; /* it will be used by fadt */
	current += sizeof(acpi_facs_t);
	acpi_create_facs(facs);

	/* FADT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * FADT at %lx\n", current);
	fadt = (acpi_fadt_t *) current;
	current += sizeof(acpi_fadt_t);

	acpi_create_fadt(fadt, facs, dsdt);
	acpi_add_table(rsdp, fadt);

	/*
	 * We explicitly add these tables later on:
	 */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * HPET at %lx\n", current);
	hpet = (acpi_hpet_t *) current;
	current += sizeof(acpi_hpet_t);
	acpi_create_hpet(hpet);
	acpi_add_table(rsdp, hpet);

	/* If we want to use HPET Timers Linux wants an MADT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * MADT at %lx\n",current);
	madt = (acpi_madt_t *) current;
	acpi_create_madt(madt);
	current += madt->header.length;
	acpi_add_table(rsdp, madt);

	/* HEST */
	current = ALIGN(current, 8);
	hest = (acpi_hest_t *)current;
	acpi_write_hest((void *)current);
	acpi_add_table(rsdp, (void *)current);
	current += ((acpi_header_t *)current)->length;

	current   = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:    * IVRS at %lx\n", current);
	ivrs = agesawrapper_getlateinitptr(PICK_IVRS);
	if (ivrs != NULL) {
		memcpy((void *)current, ivrs, ivrs->length);
		ivrs = (acpi_header_t *) current;
		current += ivrs->length;
		acpi_add_table(rsdp, ivrs);
	} else {
		printk(BIOS_DEBUG, "  AGESA IVRS table NULL. Skipping.\n");
	}

	/* SRAT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
	srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
	if (srat != NULL) {
		memcpy((void *)current, srat, srat->header.length);
		srat = (acpi_srat_t *) current;
		current += srat->header.length;
		acpi_add_table(rsdp, srat);
	} else {
		printk(BIOS_DEBUG, "  AGESA SRAT table NULL. Skipping.\n");
	}

	/* SLIT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
	slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
	if (slit != NULL) {
		memcpy((void *)current, slit, slit->header.length);
		slit = (acpi_slit_t *) current;
		current += slit->header.length;
		acpi_add_table(rsdp, slit);
	} else {
		printk(BIOS_DEBUG, "  AGESA SLIT table NULL. Skipping.\n");
	}

	/* ALIB */
	current = ALIGN(current, 16);
	printk(BIOS_DEBUG, "ACPI:  * AGESA ALIB SSDT at %lx\n", current);
	alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
	if (alib != NULL) {
		memcpy((void *)current, alib, alib->length);
		alib = (acpi_header_t *) current;
		current += alib->length;
		acpi_add_table(rsdp, (void *)alib);
	}
	else {
		printk(BIOS_DEBUG, "	AGESA ALIB SSDT table NULL. Skipping.\n");
	}

	/* this pstate ssdt may cause Blue Screen: Fixed: Keep this comment for a while. */
	/* SSDT */
	current   = ALIGN(current, 16);
	printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
	ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
	if (ssdt != NULL) {
		memcpy((void *)current, ssdt, ssdt->length);
		ssdt = (acpi_header_t *) current;
		current += ssdt->length;
	}
	else {
		printk(BIOS_DEBUG, "  AGESA PState table NULL. Skipping.\n");
	}
	acpi_add_table(rsdp,ssdt);

	printk(BIOS_DEBUG, "ACPI:    * SSDT for PState at %lx\n", current);

	printk(BIOS_DEBUG, "ACPI:    * SSDT\n");
	ssdt = (acpi_header_t *)current;

	acpi_create_ssdt_generator(ssdt, ACPI_TABLE_CREATOR);
	current += ssdt->length;
	acpi_add_table(rsdp, ssdt);

#if DUMP_ACPI_TABLES == 1
	printk(BIOS_DEBUG, "rsdp\n");
	dump_mem(rsdp, ((void *)rsdp) + sizeof(acpi_rsdp_t));

	printk(BIOS_DEBUG, "rsdt\n");
	dump_mem(rsdt, ((void *)rsdt) + sizeof(acpi_rsdt_t));

	printk(BIOS_DEBUG, "madt\n");
	dump_mem(madt, ((void *)madt) + madt->header.length);

	printk(BIOS_DEBUG, "srat\n");
	dump_mem(srat, ((void *)srat) + srat->header.length);

	printk(BIOS_DEBUG, "slit\n");
	dump_mem(slit, ((void *)slit) + slit->header.length);

	printk(BIOS_DEBUG, "ssdt\n");
	dump_mem(ssdt, ((void *)ssdt) + ssdt->length);

	printk(BIOS_DEBUG, "fadt\n");
	dump_mem(fadt, ((void *)fadt) + fadt->header.length);

	printk(BIOS_DEBUG, "hest\n");
	dump_mem(hest, ((void *)hest) + hest->header.length);
#endif

	printk(BIOS_INFO, "ACPI: done.\n");
	return current;
}
Ejemplo n.º 3
0
unsigned long write_acpi_tables(unsigned long start)
{
	unsigned long current;
	acpi_rsdp_t *rsdp;
	acpi_rsdt_t *rsdt;
	acpi_hpet_t *hpet;
	acpi_madt_t *madt;
	acpi_srat_t *srat;
	acpi_slit_t *slit;
	acpi_fadt_t *fadt;
	acpi_facs_t *facs;
	acpi_header_t *dsdt;
	acpi_header_t *ssdt;
	acpi_header_t *ssdt2;
	acpi_header_t *alib;
	acpi_hest_t *hest;

	get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */

	/* Align ACPI tables to 16 bytes */
	start = ALIGN(start, 16);
	current = start;

	printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);

	/* We need at least an RSDP and an RSDT Table */
	rsdp = (acpi_rsdp_t *) current;
	current += sizeof(acpi_rsdp_t);
	rsdt = (acpi_rsdt_t *) current;
	current += sizeof(acpi_rsdt_t);

	/* clear all table memory */
	memset((void *)start, 0, current - start);

	acpi_write_rsdp(rsdp, rsdt, NULL);
	acpi_write_rsdt(rsdt);

	/* DSDT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * DSDT at %lx\n", current);
	dsdt = (acpi_header_t *)current;
	memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
	current += dsdt->length;
	memcpy(dsdt, &AmlCode, dsdt->length);
	printk(BIOS_DEBUG, "ACPI:  * DSDT @ %p Length %x\n",dsdt,dsdt->length);

	/* FACS */ // it needs 64 bit alignment
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * FACS at %lx\n", current);
	facs = (acpi_facs_t *) current;
	current += sizeof(acpi_facs_t);
	acpi_create_facs(facs);

	/* FADT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * FADT at %lx\n", current);
	fadt = (acpi_fadt_t *) current;
	current += sizeof(acpi_fadt_t);

	acpi_create_fadt(fadt, facs, dsdt);
	acpi_add_table(rsdp, fadt);

	/*
	 * We explicitly add these tables later on:
	 */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * HPET at %lx\n", current);
	hpet = (acpi_hpet_t *) current;
	current += sizeof(acpi_hpet_t);
	acpi_create_hpet(hpet);
	acpi_add_table(rsdp, hpet);

	/* If we want to use HPET Timers Linux wants an MADT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * MADT at %lx\n",current);
	madt = (acpi_madt_t *) current;
	acpi_create_madt(madt);
	current += madt->header.length;
	acpi_add_table(rsdp, madt);

	/* HEST */
	current = ALIGN(current, 8);
	hest = (acpi_hest_t *)current;
	acpi_write_hest((void *)current);
	acpi_add_table(rsdp, (void *)current);
	current += ((acpi_header_t *)current)->length;

	/* SRAT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * SRAT at %lx\n", current);
	srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
	if (srat != NULL) {
		memcpy((void *)current, srat, srat->header.length);
		srat = (acpi_srat_t *) current;
		current += srat->header.length;
		acpi_add_table(rsdp, srat);
	}
	else {
		printk(BIOS_DEBUG, "  AGESA SRAT table NULL. Skipping.\n");
	}

	/* SLIT */
	current = ALIGN(current, 8);
	printk(BIOS_DEBUG, "ACPI:  * SLIT at %lx\n", current);
	slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
	if (slit != NULL) {
		memcpy((void *)current, slit, slit->header.length);
		slit = (acpi_slit_t *) current;
		current += slit->header.length;
		acpi_add_table(rsdp, slit);
	}
	else {
		printk(BIOS_DEBUG, "  AGESA SLIT table NULL. Skipping.\n");
	}

	/* SSDT */
	current = ALIGN(current, 16);
	printk(BIOS_DEBUG, "ACPI:  * AGESA ALIB SSDT at %lx\n", current);
	alib = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_ALIB);
	if (alib != NULL) {
		memcpy((void *)current, alib, alib->length);
		alib = (acpi_header_t *) current;
		current += alib->length;
		acpi_add_table(rsdp, (void *)alib);
	} else {
		printk(BIOS_DEBUG, "	AGESA ALIB SSDT table NULL. Skipping.\n");
	}

	/* The DSDT needs additional work for the AGESA SSDT Pstate table */
	/* Keep the comment for a while. */
	current = ALIGN(current, 16);
	printk(BIOS_DEBUG, "ACPI:  * AGESA SSDT Pstate at %lx\n", current);
	ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
	if (ssdt != NULL) {
		memcpy((void *)current, ssdt, ssdt->length);
		ssdt = (acpi_header_t *) current;
		current += ssdt->length;
		acpi_add_table(rsdp,ssdt);
	} else {
		printk(BIOS_DEBUG, "  AGESA SSDT Pstate table NULL. Skipping.\n");
	}

	current = ALIGN(current, 16);
	printk(BIOS_DEBUG, "ACPI:  * coreboot TOM SSDT2 at %lx\n", current);
	ssdt2 = (acpi_header_t *) current;
	acpi_create_ssdt_generator(ssdt2, ACPI_TABLE_CREATOR);
	current += ssdt2->length;
	acpi_add_table(rsdp,ssdt2);

	printk(BIOS_INFO, "ACPI: done.\n");
	return current;
}
Ejemplo n.º 4
0
unsigned long write_acpi_tables(unsigned long start)
{
  unsigned long current;
  acpi_rsdp_t *rsdp;
  acpi_rsdt_t *rsdt;
  acpi_hpet_t *hpet;
  acpi_madt_t *madt;
  acpi_srat_t *srat;
  acpi_slit_t *slit;
  acpi_fadt_t *fadt;
  acpi_facs_t *facs;
  acpi_header_t *dsdt;
  acpi_header_t *ssdt;

  get_bus_conf(); /* it will get sblk, pci1234, hcdn, and sbdn */

  /* Align ACPI tables to 16 bytes */
  start = (start + 0x0f) & -0x10;
  current = start;

  printk(BIOS_INFO, "ACPI: Writing ACPI tables at %lx...\n", start);

  /* We need at least an RSDP and an RSDT Table */
  rsdp = (acpi_rsdp_t *) current;
  current += sizeof(acpi_rsdp_t);
  rsdt = (acpi_rsdt_t *) current;
  current += sizeof(acpi_rsdt_t);

  /* clear all table memory */
  memset((void *)start, 0, current - start);

  acpi_write_rsdp(rsdp, rsdt, NULL);
  acpi_write_rsdt(rsdt);

  /*
   * We explicitly add these tables later on:
   */
#if 0 // Don't need HPET table.
  current   = ( current + 0x07) & -0x08;
  printk(BIOS_DEBUG, "ACPI:    * HPET at %lx\n", current);
  hpet = (acpi_hpet_t *) current;
  current += sizeof(acpi_hpet_t);
  acpi_create_hpet(hpet);
  acpi_add_table(rsdp, hpet);
#endif

  /* If we want to use HPET Timers Linux wants an MADT */
  current   = ( current + 0x07) & -0x08;
  printk(BIOS_DEBUG, "ACPI:    * MADT at %lx\n",current);
  madt = (acpi_madt_t *) current;
  acpi_create_madt(madt);
  current += madt->header.length;
  acpi_add_table(rsdp, madt);

  /* SRAT */
  current   = ( current + 0x07) & -0x08;
  printk(BIOS_DEBUG, "ACPI:    * SRAT at %lx\n", current);
  srat = (acpi_srat_t *) agesawrapper_getlateinitptr (PICK_SRAT);
  if (srat != NULL) {
    memcpy(current, srat, srat->header.length);
    srat = (acpi_srat_t *) current;
    //acpi_create_srat(srat);
    current += srat->header.length;
    acpi_add_table(rsdp, srat);
  }

  /* SLIT */
  current   = ( current + 0x07) & -0x08;
  printk(BIOS_DEBUG, "ACPI:   * SLIT at %lx\n", current);
  slit = (acpi_slit_t *) agesawrapper_getlateinitptr (PICK_SLIT);
  if (slit != NULL) {
    memcpy(current, slit, slit->header.length);
    slit = (acpi_slit_t *) current;
    //acpi_create_slit(slit);
    current += slit->header.length;
    acpi_add_table(rsdp, slit);
  }

  /* SSDT */
  current   = ( current + 0x0f) & -0x10;
  printk(BIOS_DEBUG, "ACPI:    * SSDT at %lx\n", current);
  ssdt = (acpi_header_t *)agesawrapper_getlateinitptr (PICK_PSTATE);
  if (ssdt != NULL) {
    memcpy(current, ssdt, ssdt->length);
    ssdt = (acpi_header_t *) current;
    current += ssdt->length;
  }
  else {
    ssdt = (acpi_header_t *) current;
    memcpy(ssdt, &AmlCode_ssdt, sizeof(acpi_header_t));
    current += ssdt->length;
    memcpy(ssdt, &AmlCode_ssdt, ssdt->length);
   /* recalculate checksum */
    ssdt->checksum = 0;
    ssdt->checksum = acpi_checksum((unsigned char *)ssdt,ssdt->length);
  }
  acpi_add_table(rsdp,ssdt);

  printk(BIOS_DEBUG, "ACPI:    * SSDT for PState at %lx\n", current);

  /* DSDT */
  current   = ( current + 0x07) & -0x08;
  printk(BIOS_DEBUG, "ACPI:    * DSDT at %lx\n", current);
  dsdt = (acpi_header_t *)current; // it will used by fadt
  memcpy(dsdt, &AmlCode, sizeof(acpi_header_t));
  current += dsdt->length;
  memcpy(dsdt, &AmlCode, dsdt->length);
  printk(BIOS_DEBUG, "ACPI:    * DSDT @ %p Length %x\n",dsdt,dsdt->length);

  /* FACS */ // it needs 64 bit alignment
  current   = ( current + 0x07) & -0x08;
  printk(BIOS_DEBUG, "ACPI: * FACS at %lx\n", current);
  facs = (acpi_facs_t *) current; // it will be used by fadt
  current += sizeof(acpi_facs_t);
  acpi_create_facs(facs);

  /* FADT */
  current   = ( current + 0x07) & -0x08;
  printk(BIOS_DEBUG, "ACPI:    * FADT at %lx\n", current);
  fadt = (acpi_fadt_t *) current;
  current += sizeof(acpi_fadt_t);

  acpi_create_fadt(fadt, facs, dsdt);
  acpi_add_table(rsdp, fadt);

#if DUMP_ACPI_TABLES == 1
  printk(BIOS_DEBUG, "rsdp\n");
  dump_mem(rsdp, ((void *)rsdp) + sizeof(acpi_rsdp_t));

  printk(BIOS_DEBUG, "rsdt\n");
  dump_mem(rsdt, ((void *)rsdt) + sizeof(acpi_rsdt_t));

  printk(BIOS_DEBUG, "madt\n");
  dump_mem(madt, ((void *)madt) + madt->header.length);

  printk(BIOS_DEBUG, "srat\n");
  dump_mem(srat, ((void *)srat) + srat->header.length);

  printk(BIOS_DEBUG, "slit\n");
  dump_mem(slit, ((void *)slit) + slit->header.length);

  printk(BIOS_DEBUG, "ssdt\n");
  dump_mem(ssdt, ((void *)ssdt) + ssdt->length);

  printk(BIOS_DEBUG, "fadt\n");
  dump_mem(fadt, ((void *)fadt) + fadt->header.length);
#endif

  printk(BIOS_INFO, "ACPI: done.\n");
  return current;
}