12d0d5f41SDavid Hildenbrand /* 22d0d5f41SDavid Hildenbrand * Copyright (c) 2018 Red Hat Inc 32d0d5f41SDavid Hildenbrand * 42d0d5f41SDavid Hildenbrand * Authors: 52d0d5f41SDavid Hildenbrand * David Hildenbrand <david@redhat.com> 62d0d5f41SDavid Hildenbrand * 72d0d5f41SDavid Hildenbrand * This code is free software; you can redistribute it and/or modify it 82d0d5f41SDavid Hildenbrand * under the terms of the GNU Library General Public License version 2. 92d0d5f41SDavid Hildenbrand */ 102d0d5f41SDavid Hildenbrand #ifndef _ASM_S390X_FLOAT_H_ 112d0d5f41SDavid Hildenbrand #define _ASM_S390X_FLOAT_H_ 122d0d5f41SDavid Hildenbrand 132d0d5f41SDavid Hildenbrand static inline void set_fpc(uint32_t fpc) 142d0d5f41SDavid Hildenbrand { 152d0d5f41SDavid Hildenbrand asm volatile(" lfpc %0\n" : : "m"(fpc) ); 162d0d5f41SDavid Hildenbrand } 172d0d5f41SDavid Hildenbrand 182d0d5f41SDavid Hildenbrand static inline uint32_t get_fpc(void) 192d0d5f41SDavid Hildenbrand { 202d0d5f41SDavid Hildenbrand uint32_t fpc; 212d0d5f41SDavid Hildenbrand 222d0d5f41SDavid Hildenbrand asm volatile(" stfpc %0\n" : "=m"(fpc)); 232d0d5f41SDavid Hildenbrand 242d0d5f41SDavid Hildenbrand return fpc; 252d0d5f41SDavid Hildenbrand } 262d0d5f41SDavid Hildenbrand 27*dfe993b0SThomas Huth static inline uint8_t get_fpc_dxc(void) 282d0d5f41SDavid Hildenbrand { 292d0d5f41SDavid Hildenbrand return get_fpc() >> 8; 302d0d5f41SDavid Hildenbrand } 312d0d5f41SDavid Hildenbrand 322d0d5f41SDavid Hildenbrand static inline void set_fpc_dxc(uint8_t dxc) 332d0d5f41SDavid Hildenbrand { 342d0d5f41SDavid Hildenbrand uint32_t fpc = get_fpc(); 352d0d5f41SDavid Hildenbrand 362d0d5f41SDavid Hildenbrand fpc = (fpc & ~0xff00) | ((uint32_t)dxc) << 8; 372d0d5f41SDavid Hildenbrand 382d0d5f41SDavid Hildenbrand set_fpc(fpc); 392d0d5f41SDavid Hildenbrand } 402d0d5f41SDavid Hildenbrand 412d0d5f41SDavid Hildenbrand static inline void afp_enable(void) 422d0d5f41SDavid Hildenbrand { 432d0d5f41SDavid Hildenbrand ctl_set_bit(0, 63 - 45); 442d0d5f41SDavid Hildenbrand } 452d0d5f41SDavid Hildenbrand 462d0d5f41SDavid Hildenbrand static inline void afp_disable(void) 472d0d5f41SDavid Hildenbrand { 482d0d5f41SDavid Hildenbrand ctl_clear_bit(0, 63 - 45); 492d0d5f41SDavid Hildenbrand } 502d0d5f41SDavid Hildenbrand 512d0d5f41SDavid Hildenbrand #endif 52