/******************************************************************************* * * FUNCTION: acpi_decode_pld_buffer * * PARAMETERS: in_buffer - Buffer returned by _PLD method * length - Length of the in_buffer * return_buffer - Where the decode buffer is returned * * RETURN: Status and the decoded _PLD buffer. User must deallocate * the buffer via ACPI_FREE. * * DESCRIPTION: Decode the bit-packed buffer returned by the _PLD method into * a local struct that is much more useful to an ACPI driver. * ******************************************************************************/ acpi_status acpi_decode_pld_buffer(u8 *in_buffer, acpi_size length, struct acpi_pld_info **return_buffer) { struct acpi_pld_info *pld_info; u32 *buffer = ACPI_CAST_PTR(u32, in_buffer); u32 dword; /* Parameter validation */ if (!in_buffer || !return_buffer || (length < ACPI_PLD_REV1_BUFFER_SIZE)) { return (AE_BAD_PARAMETER); } pld_info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_pld_info)); if (!pld_info) { return (AE_NO_MEMORY); } /* First 32-bit DWord */ ACPI_MOVE_32_TO_32(&dword, &buffer[0]); pld_info->revision = ACPI_PLD_GET_REVISION(&dword); pld_info->ignore_color = ACPI_PLD_GET_IGNORE_COLOR(&dword); pld_info->red = ACPI_PLD_GET_RED(&dword); pld_info->green = ACPI_PLD_GET_GREEN(&dword); pld_info->blue = ACPI_PLD_GET_BLUE(&dword); /* Second 32-bit DWord */ ACPI_MOVE_32_TO_32(&dword, &buffer[1]); pld_info->width = ACPI_PLD_GET_WIDTH(&dword); pld_info->height = ACPI_PLD_GET_HEIGHT(&dword); /* Third 32-bit DWord */ ACPI_MOVE_32_TO_32(&dword, &buffer[2]); pld_info->user_visible = ACPI_PLD_GET_USER_VISIBLE(&dword); pld_info->dock = ACPI_PLD_GET_DOCK(&dword); pld_info->lid = ACPI_PLD_GET_LID(&dword); pld_info->panel = ACPI_PLD_GET_PANEL(&dword); pld_info->vertical_position = ACPI_PLD_GET_VERTICAL(&dword); pld_info->horizontal_position = ACPI_PLD_GET_HORIZONTAL(&dword); pld_info->shape = ACPI_PLD_GET_SHAPE(&dword); pld_info->group_orientation = ACPI_PLD_GET_ORIENTATION(&dword); pld_info->group_token = ACPI_PLD_GET_TOKEN(&dword); pld_info->group_position = ACPI_PLD_GET_POSITION(&dword); pld_info->bay = ACPI_PLD_GET_BAY(&dword); /* Fourth 32-bit DWord */ ACPI_MOVE_32_TO_32(&dword, &buffer[3]); pld_info->ejectable = ACPI_PLD_GET_EJECTABLE(&dword); pld_info->ospm_eject_required = ACPI_PLD_GET_OSPM_EJECT(&dword); pld_info->cabinet_number = ACPI_PLD_GET_CABINET(&dword); pld_info->card_cage_number = ACPI_PLD_GET_CARD_CAGE(&dword); pld_info->reference = ACPI_PLD_GET_REFERENCE(&dword); pld_info->rotation = ACPI_PLD_GET_ROTATION(&dword); pld_info->order = ACPI_PLD_GET_ORDER(&dword); if (length >= ACPI_PLD_REV2_BUFFER_SIZE) { /* Fifth 32-bit DWord (Revision 2 of _PLD) */ ACPI_MOVE_32_TO_32(&dword, &buffer[4]); pld_info->vertical_offset = ACPI_PLD_GET_VERT_OFFSET(&dword); pld_info->horizontal_offset = ACPI_PLD_GET_HORIZ_OFFSET(&dword); } *return_buffer = pld_info; return (AE_OK); }
ACPI_STATUS AcpiDecodePldBuffer ( UINT8 *InBuffer, ACPI_SIZE Length, ACPI_PLD_INFO **ReturnBuffer) { ACPI_PLD_INFO *PldInfo; UINT32 *Buffer = ACPI_CAST_PTR (UINT32, InBuffer); UINT32 Dword; /* Parameter validation */ if (!InBuffer || !ReturnBuffer || (Length < ACPI_PLD_REV1_BUFFER_SIZE)) { return (AE_BAD_PARAMETER); } PldInfo = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_PLD_INFO)); if (!PldInfo) { return (AE_NO_MEMORY); } /* First 32-bit DWord */ ACPI_MOVE_32_TO_32 (&Dword, &Buffer[0]); PldInfo->Revision = ACPI_PLD_GET_REVISION (&Dword); PldInfo->IgnoreColor = ACPI_PLD_GET_IGNORE_COLOR (&Dword); PldInfo->Red = ACPI_PLD_GET_RED (&Dword); PldInfo->Green = ACPI_PLD_GET_GREEN (&Dword); PldInfo->Blue = ACPI_PLD_GET_BLUE (&Dword); /* Second 32-bit DWord */ ACPI_MOVE_32_TO_32 (&Dword, &Buffer[1]); PldInfo->Width = ACPI_PLD_GET_WIDTH (&Dword); PldInfo->Height = ACPI_PLD_GET_HEIGHT(&Dword); /* Third 32-bit DWord */ ACPI_MOVE_32_TO_32 (&Dword, &Buffer[2]); PldInfo->UserVisible = ACPI_PLD_GET_USER_VISIBLE (&Dword); PldInfo->Dock = ACPI_PLD_GET_DOCK (&Dword); PldInfo->Lid = ACPI_PLD_GET_LID (&Dword); PldInfo->Panel = ACPI_PLD_GET_PANEL (&Dword); PldInfo->VerticalPosition = ACPI_PLD_GET_VERTICAL (&Dword); PldInfo->HorizontalPosition = ACPI_PLD_GET_HORIZONTAL (&Dword); PldInfo->Shape = ACPI_PLD_GET_SHAPE (&Dword); PldInfo->GroupOrientation = ACPI_PLD_GET_ORIENTATION (&Dword); PldInfo->GroupToken = ACPI_PLD_GET_TOKEN (&Dword); PldInfo->GroupPosition = ACPI_PLD_GET_POSITION (&Dword); PldInfo->Bay = ACPI_PLD_GET_BAY (&Dword); /* Fourth 32-bit DWord */ ACPI_MOVE_32_TO_32 (&Dword, &Buffer[3]); PldInfo->Ejectable = ACPI_PLD_GET_EJECTABLE (&Dword); PldInfo->OspmEjectRequired = ACPI_PLD_GET_OSPM_EJECT (&Dword); PldInfo->CabinetNumber = ACPI_PLD_GET_CABINET (&Dword); PldInfo->CardCageNumber = ACPI_PLD_GET_CARD_CAGE (&Dword); PldInfo->Reference = ACPI_PLD_GET_REFERENCE (&Dword); PldInfo->Rotation = ACPI_PLD_GET_ROTATION (&Dword); PldInfo->Order = ACPI_PLD_GET_ORDER (&Dword); if (Length >= ACPI_PLD_REV2_BUFFER_SIZE) { /* Fifth 32-bit DWord (Revision 2 of _PLD) */ ACPI_MOVE_32_TO_32 (&Dword, &Buffer[4]); PldInfo->VerticalOffset = ACPI_PLD_GET_VERT_OFFSET (&Dword); PldInfo->HorizontalOffset = ACPI_PLD_GET_HORIZ_OFFSET (&Dword); } *ReturnBuffer = PldInfo; return (AE_OK); }